home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus Leser 19 / Amiga Plus Leser CD 19.iso / Online / AmigaTalk / examples / DiningPhilosophers.st < prev    next >
Text File  |  2002-01-30  |  2KB  |  74 lines

  1. " Example of the Dining Philosophers computing problem."
  2.  
  3. Class  Main
  4. [
  5.   main
  6.     (DiningPhilosophers new: 5) dine: 4
  7. ]
  8.  
  9. Class  DiningPhilosophers ! diners  forks  philosophers !
  10. [
  11.   new: aNumber
  12.     diners       <- aNumber.
  13.     forks        <- Array new: aNumber.
  14.     philosophers <- Array new: aNumber.
  15.     (1 to: diners) do: [:p | forks at: p put: (Semaphore new: 1).
  16.                          philosophers at: p put: (Philosopher new: p)
  17.                        ]
  18. |
  19.   dine: time
  20.     (1 to: diners) do: [:p | (philosophers at: p)
  21.                              leftFork: (forks at: p)
  22.                              rightFork: (forks at: ((p \\ diners) + 1))
  23.                        ].
  24.     time timesRepeat: [(1 to: diners) do: [:p | (philosophers at: p) 
  25.                               philosophize]
  26.                       ].
  27.  
  28.     (1 to: diners) do: [:p | (philosophers at: p) sleep]
  29. ]
  30.  
  31. Class  Philosopher ! leftFork  rightFork  myName  myPhilosophy !
  32. [
  33.   new:  name
  34.     myName       <- name.
  35.     myPhilosophy <- [[true] 
  36.                      whileTrue: [ self think.
  37.                                   self getForks.
  38.                                   self eat.
  39.                                   self releaseForks.
  40.                                   selfProcess suspend
  41.                                 ]
  42.                     ] newProcess
  43. |
  44.   leftFork: lfork  rightFork: rfork
  45.     leftFork  <- lfork.
  46.     rightFork <- rfork
  47. |
  48.   getForks
  49.     ((myName \\ 2) == 0)
  50.       ifTrue:  [leftFork  wait.  rightFork wait]
  51.       ifFalse: [rightFork wait.  leftFork  wait]
  52. |
  53.   releaseForks
  54.     leftFork  signal.
  55.     rightFork signal
  56. |
  57.   think
  58.     ('Philosopher ',(myName asString),' is thinking.') print.
  59.     10 timesRepeat: [selfProcess yield]
  60. |
  61.   eat
  62.     ('Philosopher ',(myName asString),' is eating.') print.
  63.     10 timesRepeat: [selfProcess yield]
  64.  
  65. |
  66.   philosophize
  67.     myPhilosophy resume
  68. |
  69.   sleep
  70.     myPhilosophy terminate.
  71.     ('Philosopher ',(myName asString),' is sleeping.') print.
  72.     myPhilosophy <- nil
  73. ]
  74.